package com.bankcomm.ui.specialwidget;

import java.util.Vector;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.text.TextPaint;
import android.view.Gravity;
import android.view.MotionEvent;
import android.widget.AbsoluteLayout;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bankcomm.R;
import com.bankcomm.ui.EMPView;
import com.rytong.tools.ui.Component;
import com.rytong.tools.ui.CssStyle;
import com.rytong.tools.utils.Utils;

/**
 * 电影院控件。
 */
public class LPMovieTicket extends Component {

	/**
	 * 属性值。
	 */
	String attrName_;
	/**
	 * 用到的cssStyle样式。
	 */
	protected CssStyle cssStyle_;
	/**
	 * 整体背景。
	 */
	private int bigBgColor_ = 0x00000000; // 80％透明度的白色为0xCCFFFFFF。
	/**
	 * 整体的宽。
	 */
	private int width_;
	/**
	 * 所有座位的宽度和。
	 */
	private int seatsWidth;
	/**
	 * 屏幕高度。
	 */
	private int moiveScreenheight_;
	/**
	 * 所有座位的高度和。
	 */
	private int allSeatHeight;
	/**
	 * 默认的座位状态区高度。
	 */
	private int seatStatusHeight = Utils.getScaledValueY(40);
	/**
	 * 用到的EMPView对象。
	 */
	protected EMPView empview_;
	/**
	 * 绘制座位时候的画笔。
	 */
	public static TextPaint paint_;
	/**
	 * 最大选座数。
	 */
	public static int canChooseMaxSeats;
	/**
	 * 座位按下时候的x坐标。
	 */
	int xSeatDown_;
	/**
	 * 座位按下时候的y坐标。
	 */
	int ySeatDown_;
	/**
	 * 用来滑动显示所有座位的横向滚动区域。
	 */
	CustomHorizontalScrollView seatVL;
	/**
	 * 盛放所有座位的一个布局。
	 */
	LinearLayout l;
	/**
	 * 最大行数。
	 */
	private int maxRow = 0;
	/**
	 * 最大列数。
	 */
	static int maxCol = 0;
	// seat images
	/**
	 * 可以购买。
	 */
	public static final int CAN_BUY_IMG = 0;
	/**
	 * 已售座位。
	 */
	public static final int IS_BUY_IMG = 1;
	/**
	 * 已选座位。
	 */
	public static final int SELECTED_IMG = 2;
	/**
	 * 座位图片数组。
	 */
	static Bitmap[] seatImg_;
	/**
	 * 已购座位列表。
	 */
	public static Vector<Seat> selectedList;
	// 座位区离上下左右的距离
	/**
	 * 作为区上边距。
	 */
	private final int topMarge = Utils.getScaledValueY(4);
	/**
	 * 作为区下边距。
	 */
	private final int bottomMarge = Utils.getScaledValueY(4);
	/**
	 * 座位之间的间距。
	 */
	private int seatGap = Utils.getScaledValueY(4);
	/**
	 * 屏幕及座位状态提示区域。
	 */
	ScreenView screenV;
	/**
	 * 放置所有座位的座位区。
	 */
	SeatView seatV;
	/**
	 * 左方排数提示区。
	 */
	SeatNoView seatNoV;
	/**
	 * 选座结果展示区。
	 */
	SelectedListView selectedListV;
	/**
	 * 相当于电影院自身。
	 */
	static LPMovieTicket itself;
	
	/**
	 * 用来滑动显示所有座位的横向滚动区域。这个类主要是将焦点从横向滚动视图中夺回来。
	 */
	public class CustomHorizontalScrollView extends HorizontalScrollView{

		public CustomHorizontalScrollView(Context context) {
			super(context);
		}
		
		@Override
		public boolean onTouchEvent(MotionEvent ev) {
			switch (ev.getAction()) {
			case MotionEvent.ACTION_DOWN:
				if(hs_ != null){
					hs_.focusObj_ = seatVL;
				}
				break;
			case MotionEvent.ACTION_MOVE:
				
				break;
			case MotionEvent.ACTION_UP:
				if(hs_ != null){
					hs_.focusObj_ = null;
				}
				break;
			default:
				break;
			}
			return super.onTouchEvent(ev);
		}
	}

	/**
	 * 屏幕区域，包含三个提示：已售座位、可选座位、已选座位。
	 */
	class ScreenView extends TextView {

		/**
		 * 座位状态提示语。
		 */
		private String[] prompt = {
				empview_.getResources().getString(R.string.movie_seattype1),
				empview_.getResources().getString(R.string.movie_seattype2),
				empview_.getResources().getString(R.string.movie_seattype3) };
		/**
		 * 电影标题。
		 */
		String filmTitle = "";
		/**
		 * 绘制时候的横坐标。
		 */
		int posX = 0;
		/**
		 * 绘制时候的纵坐标。
		 */
		int posY = 0;
		/**
		 * 模拟的一条屏幕。
		 */
		private RectF visualRect = null;
		/**
		 * 座位提示语之间的间隔。
		 */
		private float gap_ = 10;
		/**
		 * 分隔线的背景。
		 */
		private Rect vSeparatorBg_ = null;
		/**
		 * 分隔线的主体。
		 */
		private Rect vSeparatorMain_ = null;

		public ScreenView(Context context) {
			super(context);
		}

		protected void onDraw(Canvas canvas) {
			// 画电影标题。
			if (null != filmTitle) {
				paint_.setColor(0xFF000000);
				canvas.drawText(filmTitle,
						(width_ - (int) paint_.measureText(filmTitle)) >> 1,
						posY + (moiveScreenheight_ + paint_.getTextSize()) / 2,
						paint_);
				posY = moiveScreenheight_;
			}
			// 画模拟的一条屏幕。
			paint_.setColor(bigBgColor_);
			if (visualRect == null) {
				visualRect = new RectF(0, 0, width_, posY + seatStatusHeight
						+ 5);
			}
//			canvas.drawRoundRect(visualRect, 5, 5, paint_);
			canvas.drawRoundRect(visualRect, 0, 0, paint_);
			
			// 画座位状态提示语。
			posX = 7;
			paint_.setColor(0xFF8F99BA);
			paint_.setTextSize(Utils.getFontSize(15));
			int one_width = seatImg_[0].getWidth()+ (int) paint_.measureText(prompt[0])+3;
			int lr = (int) ((width_ - 3*one_width - 2*gap_)/2.0f);
			posX = lr;
			for (int i = 0; i <= 2; i++) {
				if (i > 0) {
					posX = lr + (int) ((one_width+gap_)*i);
				}
				canvas.drawBitmap(seatImg_[i], posX, posY + (seatStatusHeight - seatImg_[i].getHeight()) / 2,
						paint_);
				canvas.drawText(prompt[i], posX + seatImg_[i].getWidth() + 3,
						posY + (seatStatusHeight + paint_.getTextSize()) / 2,
						paint_);
			}
			
			// 画一条分隔线。
			paint_.setColor(Color.WHITE);
			if(vSeparatorBg_ == null){
				vSeparatorBg_ = new Rect(0, posY + seatStatusHeight - 
						Math.max(2, Utils.getScaledValueY(1.5f)), 
						width_, posY + seatStatusHeight);
			}
			canvas.drawRect(vSeparatorBg_, paint_);
			paint_.setColor(0xFFA1A2AD);
			if(vSeparatorMain_ == null){
				vSeparatorMain_ = new Rect(0, posY + seatStatusHeight - 
						Math.max(2, Utils.getScaledValueY(1.5f)),
						width_, posY + seatStatusHeight - 
						Math.max(1, Utils.getScaledValueY(0.75f)));
			}
			canvas.drawRect(vSeparatorMain_, paint_);
		}
	}

	/**
	 * 用来绘制左方一个竖条的类，内容是1～n排的文字提示。
	 */
	class SeatNoView extends RelativeLayout {

		public SeatNoView(Context context) {
			super(context);
			setLayoutParams(new LayoutParams(seatImg_[0].getWidth() * 2,
					LayoutParams.FILL_PARENT));
		}

		void addseatNo(String seatNo, int row) {
			SeatRowView tv = new SeatRowView(empview_, seatNo.concat(empview_
					.getResources().getString(R.string.movie_seatrow)), row);
			RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
					tv.text_w, tv.text_h);
			lp.topMargin = (row - 1) * (seatImg_[0].getHeight() + seatGap);
			tv.setLayoutParams(lp);
			this.addView(tv);
		}
	}

	/**
	 * 座位排号类，绘制座位排数的。
	 */
	class SeatRowView extends TextView {

		/**
		 * 显示的文字。
		 */
		private String text_;
		/**
		 * 绘制文字时候的画笔。
		 */
		private Paint font_ = new Paint();
		/**
		 * 文字宽。
		 */
		int text_w = seatImg_[0].getWidth() * 2;
		/**
		 * 文字高。
		 */
		int text_h = seatImg_[0].getHeight();
		/**
		 * 文字边角。
		 */
//		int text_circle_raius = text_wh / 2;

		public SeatRowView(Context context, String text, int row) {
			super(context);
			text_ = text;
			setGravity(Gravity.CENTER);
		}

		@Override
		public void onDraw(Canvas g) {
			font_.setColor(0xFF8F99BA);
//			g.drawCircle(text_wh / 2, text_wh / 2, text_circle_raius, font_);

			if (text_ != null) {
//				font_.setColor(Color.WHITE);
//				font_.setFakeBoldText(true);
				font_.setAntiAlias(true);
				font_.setTextSize(Utils.getFontSize(13));
				g.drawText(text_, (text_w - font_.measureText(text_)) / 2,
						(text_h + font_.getTextSize()) / 2, font_);
			}
		}
	}

	/**
	 * 座位区，放置所有的座位。
	 */
	class SeatView extends RelativeLayout {

		public SeatView(Context context) {
			super(context);
		}

		void addseat(Seat seat) {
			this.addView(seat.realView_);
			RelativeLayout.LayoutParams lp = (LayoutParams) seat
					.getLayoutParams();
			lp.leftMargin = (seat.col - 1) * (seatImg_[0].getWidth() + seatGap);
			lp.topMargin = (seat.row - 1) * (seatImg_[0].getHeight() + seatGap);
			lp.width = lp.width + Utils.getScaledValueX(10);
			seat.setLayoutParams(lp);
		}

		boolean judgeSeatCanBeChoose(Vector<Seat> selectedList, Seat seat) {
			Seat temp;
			int t = -1;
			for (int i = 0; i < selectedList.size(); i++) {
				temp = selectedList.elementAt(i);
				if (temp.row == seat.row) {
					if (Math.abs(temp.col - seat.col) > 1) {
						t = 0;
					} else {
						temp = null;
						return true;
					}
				}
			}
			if (t == 0) {
				temp = null;
				return false;
			}
			temp = null;
			return true;
		}

		boolean judgeSeatCanBeCancel(Vector<Seat> selectedList, Seat seat) {
			Seat temp;
			int t = 0;
			for (int i = 0; i < selectedList.size(); i++) {
				temp = selectedList.elementAt(i);
				if (temp.row == seat.row && Math.abs(temp.col - seat.col) == 1) {
					t++;
				}
			}
			temp = null;
			if (t >= 2) {
				return false;
			}
			return true;
		}
	}

	/**
	 * 选座结果展示区。
	 */
	class SelectedListView extends TextView {

		private float preFSize = paint_.getTextSize();
		private int posX = 0;
		private int posY = 0;
		private Seat st = null;
		private String convertSeatNo = null;
		private int colonIndex_ = -1;
		private Rect vSeparatorBg_ = null;
		private Rect vSeparatorMain_ = null;

		// 获得选作结果展示区的高度。
		public int getRealHeight() {
			paint_.setTextSize(Utils.getFontSize(15));
			return (int) (4.2f * ((int) paint_.getTextSize() + seatGap) + 15);
		}

		public SelectedListView(Context context) {
			super(context);
		}

		protected void onDraw(Canvas canvas) {
			paint_.setTextSize(Utils.getFontSize(15));
			posY = (int) (paint_.getTextSize() * 1.2f);
			RectF rect = new RectF(0, -5, width_,
					4.2f * ((int) paint_.getTextSize() + seatGap) + 15);
			paint_.setColor(bigBgColor_);
//			canvas.drawRoundRect(rect, 5, 5, paint_);
			canvas.drawRoundRect(rect, 0, 0, paint_);
			// 顶部画一条线。
			paint_.setColor(Color.WHITE);
			if(vSeparatorBg_ == null){
				vSeparatorBg_ = new Rect(0, 0, width_, Math.max(2, Utils.getScaledValueY(1.5f)));
			}
			canvas.drawRect(vSeparatorBg_, paint_);
			paint_.setColor(0xFFA1A2AD);
			if(vSeparatorMain_ == null){
				vSeparatorMain_ = new Rect(0, 0, width_, Math.max(1, Utils.getScaledValueY(0.75f)));
			}
			canvas.drawRect(vSeparatorMain_, paint_);
			// 画信息部分。
			paint_.setColor(0xFF2A418A);
			posX = 5;
			if (selectedList != null && selectedList.size() > 0) {
				paint_.setTextSize(Utils.getFontSize(18));
				canvas.drawText(
						empview_.getResources().getString(
								R.string.movie_seattype3), posX, posY + 14,
						paint_);
				paint_.setColor(0xFF2A418A);
				for (int i = 0; i < selectedList.size(); i++) {
					st = (Seat) selectedList.elementAt(i);
					convertSeatNo = st.seatNo;
					colonIndex_ = convertSeatNo.indexOf(":");
					if (colonIndex_ > -1) {
						convertSeatNo = st.seatNo
								.substring(0, colonIndex_)
								.concat(empview_.getResources().getString(
										R.string.movie_seatrow))
								.concat(st.seatNo.substring(colonIndex_ + 1))
								.concat(empview_.getResources().getString(
										R.string.movie_seat));
					}
					paint_.setTextSize(Utils.getFontSize(15));
					canvas.drawText(convertSeatNo, posX + (i % 4)
							* (width_ / 4 - 4), posY + 22 + (i / 4 + 1)
							* (int) (paint_.getTextSize() + seatGap), paint_);
				}
			}
			paint_.setTextSize(preFSize);
		}
	}

	public class MyLPMovieTicket extends LinearLayout implements
			CompositedComponent {

		public MyLPMovieTicket(Context context) {
			super(context);
			empview_ = (EMPView) context;
			itself = LPMovieTicket.this;
			init();

			// 设置布局方式为垂直
			setOrientation(LinearLayout.VERTICAL);

			if (null == screenV) {
				screenV = new ScreenView(context);
			}
			if (null == seatV) {
				seatV = new SeatView(context);
			}
			if (null == seatNoV) {
				seatNoV = new SeatNoView(context);
			}
			if (null == selectedListV) {
				selectedListV = new SelectedListView(context);
			}

			this.setFocusable(true);
			this.setFocusableInTouchMode(true);
		}

		void init() {
			paint_ = new TextPaint();
			paint_.setAntiAlias(true);

			seatImg_ = new Bitmap[3];
			seatImg_[CAN_BUY_IMG] = BitmapFactory.decodeResource(
					empview_.getResources(), R.drawable.seat_one);
			seatImg_[IS_BUY_IMG] = BitmapFactory.decodeResource(
					empview_.getResources(), R.drawable.seat_two);
			seatImg_[SELECTED_IMG] = BitmapFactory.decodeResource(
					empview_.getResources(), R.drawable.seat_three);

			selectedList = new Vector<Seat>();
			seatsWidth = SCREENWIDTH - Utils.getScaledValueX(20);
			
			// 对图片进行一下缩放。
			paint_.setTextSize(Utils.getFontSize(15));
			/**
			 * 7代表座位状态提示语最左边开始的7个间隔，详见ScreenView的onDraw方法中posX属性的赋值。
			 * 10代表座位状态提示语之间的间距，详见ScreenView的gap_属性。
			 */
//			int targetWidth = (int) (((seatsWidth - 7) / 3)
//					- paint_.measureText(empview_.getResources().getString(
//							R.string.movie_seattype1)) - 10);
//			for (int i = 0; i < seatImg_.length; i++) {
//				seatImg_[i] = Bitmap.createScaledBitmap(seatImg_[i],
//						targetWidth, targetWidth, false);
//			}
		}

		@Override
		public Component composited() {
			return LPMovieTicket.this;
		}
	}

	@Override
	public void initRealView(Activity arg0, String arg1) {
		super.initRealView(arg0, arg1);
		realView_ = new MyLPMovieTicket(arg0);
	}

	@Override
	public void mouldH() throws Exception {
		super.mouldH();
		// 初始化座位列表。
		initLayoutData();
		// 初始化控件的宽度。
		if (width_ <= 0) {
			width_ = SCREENWIDTH - Utils.getScaledValueX(20);
		}
		// 读取样式。
		if (cssStyle_ != null) {
			String temp = (String) cssStyle_.getProperty(CssStyle.FONTSIZE);
			int fontSize = 0;
			if (null != temp && !temp.equals("")) {
				fontSize = Integer.parseInt(fixedPX(temp));
				fontSize = Utils.getFontSize(fontSize);
			}

			if (cssStyle_ != null && fontSize > 0) {
				paint_.setTextSize(fontSize);
			} else {
				paint_.setTextSize(Utils.getFontSize(11));
			}
		}
		// 初始化座位高度和。
		if (maxRow > 0) {
			allSeatHeight = topMarge + bottomMarge + maxRow
					* (seatImg_[0].getHeight() + seatGap) - seatGap;
		}
		// 屏幕高度。
		moiveScreenheight_ = 2 * (int) paint_.getTextSize();
		// 初始化上方屏幕及座位状态提示信息区域。
		screenV.setLayoutParams(new LinearLayout.LayoutParams(width_,
				(null == screenV.filmTitle) ? seatStatusHeight
						: (seatStatusHeight + moiveScreenheight_)));
		// 初始化选座结果展示区。
		LinearLayout.LayoutParams selectedlay_ = new LinearLayout.LayoutParams(
				width_, selectedListV.getRealHeight());
		selectedListV.setLayoutParams(selectedlay_);
		// 初始化所有座位的宽度和。
		if (maxCol > 0) {
			seatsWidth = Math.max(seatsWidth, maxCol
					* (seatImg_[0].getWidth() + seatGap));
		}
		// 初始化放置座位和排数提示区域的布局。
		l = new LinearLayout(empview_);
		LinearLayout.LayoutParams llay_ = new LinearLayout.LayoutParams(width_,
				allSeatHeight);
		l.setLayoutParams(llay_);
		l.setPadding(3, 3, 3, 3);
		l.setBackgroundColor(bigBgColor_);
		if (null != l) {
			l.removeAllViews();
		}
		// 初始化左方排数提示区。
		if (null != seatNoV)
			l.addView(seatNoV);
		// 初始化座位区。
		seatV.setLayoutParams(new HorizontalScrollView.LayoutParams(seatsWidth,
				allSeatHeight));
		// 初始化横向滑动区域。
		seatVL = new CustomHorizontalScrollView(empview_);
		seatVL.setLayoutParams(new LinearLayout.LayoutParams(width_
				- seatImg_[0].getWidth() * 2, allSeatHeight));
		if (null != seatVL) {
			seatVL.removeAllViews();
		}
		if (null != seatV) {
			seatVL.addView(seatV);
		}
		if (null != seatVL)
			l.addView(seatVL);
		MyLPMovieTicket tempMovieTicket = (MyLPMovieTicket) realView_;
		if (null != tempMovieTicket) {
			tempMovieTicket.removeAllViews();
		}
		if (null != screenV)
			tempMovieTicket.addView(screenV);
		if (null != l)
			tempMovieTicket.addView(l);
		if (null != selectedListV)
			tempMovieTicket.addView(selectedListV);
		// 计算每个部分的高度。
		int height1 = (null == screenV.filmTitle) ? seatStatusHeight
				: (seatStatusHeight + moiveScreenheight_);
		int height2 = allSeatHeight;
		int height3 = selectedListV.getRealHeight();
		// 计算整体的高度，也就是累加一下。
		setLayoutParams(new AbsoluteLayout.LayoutParams(width_, height1
				+ height2 + height3, 0, 0));
		// 初始化视图。
		initView();
	}

	private void initView() {
		// 拿到电影院的属性值。
		attrName_ = (String) getPropertyByName("name");
		// 拿到影片的标题。
		screenV.filmTitle = (String) getPropertyByName("filmtitle");
		// 初始化最大座位数。
		try {
			canChooseMaxSeats = Integer
					.parseInt((String) getPropertyByName("limit"));
		} catch (Exception e) {
			// 最大选座数默认为5。
			canChooseMaxSeats = 5;
		}
		Seat seat;
		if (childrenList_.size() > 0) {
			for (int i = 0; i < childrenList_.size(); i++) {
				seat = (Seat) childrenList_.get(i);
				seatNoV.addseatNo(
						seat.seatNo.substring(0, seat.seatNo.indexOf(":")),
						seat.row);
				seatV.addseat(seat);
			}
		}
	}

	private void initLayoutData() {
		Seat seat = null;
		if (childrenList_.size() > 0) {
			for (int i = 0; i < childrenList_.size(); i++) {
				// 拿到一个座位。
				seat = (Seat) childrenList_.get(i);
				// 拿到座位的seatNo属性。
				seat.seatNo = (String) seat.getPropertyByName("seatNo");
				// 从seatNo属性的冒号处取后边的数字座位座位号。
				seat.id = seat.seatNo.substring(seat.seatNo.indexOf(":") + 1);
				// 拿到座位状态。
				seat.type = Integer.parseInt((String) seat
						.getPropertyByName("status"));
				// 拿到coordinate属性。
				String tempcoordinate = (String) seat
						.getPropertyByName("coordinate");
				// 拿到座位所处的行。
				seat.row = Integer.parseInt(tempcoordinate.substring(0,
						tempcoordinate.indexOf(":")));
				// 拿到座位所处的列。
				seat.col = Integer.parseInt(tempcoordinate
						.substring(tempcoordinate.indexOf(":") + 1));
				// 登记最大行。
				if (maxRow < seat.row) {
					maxRow = seat.row;
				}
				// 登记最大列。
				if (maxCol < seat.col) {
					maxCol = seat.col;
				}
			}
		}
	}

	@Override
	public void releaseResource(Component component) {
		super.releaseResource(component);
		if(seatImg_ != null && seatImg_.length > 0){
			for (int i = 0; i < seatImg_.length; i++) {
				if(seatImg_[i] != null && !seatImg_[i].isRecycled()){
					seatImg_[i].recycle();
					seatImg_[i] = null;
				}
			}
			seatImg_ = null;
		}
		if(selectedList != null){
			selectedList.clear();
			selectedList = null;
		}
	}
}
